/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.activiti.osgi.blueprint;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.impl.ProcessEngineImpl;
import org.osgi.framework.Bundle;

/**
 * @author Guillaume Nodet
 */
public class ProcessEngineFactory {

  protected ProcessEngineConfiguration processEngineConfiguration;
  protected Bundle bundle;

  protected ProcessEngineImpl processEngine;

  public void init() throws Exception {
    ClassLoader previous = Thread.currentThread().getContextClassLoader();

    try {
      ClassLoader cl = new BundleDelegatingClassLoader(bundle);

      Thread.currentThread().setContextClassLoader(new ClassLoaderWrapper(cl, ProcessEngineFactory.class.getClassLoader(), ProcessEngineConfiguration.class.getClassLoader(), previous));

      processEngineConfiguration.setClassLoader(cl);

      processEngine = (ProcessEngineImpl) processEngineConfiguration.buildProcessEngine();

    } finally {
      Thread.currentThread().setContextClassLoader(previous);
    }
  }

  public void destroy() throws Exception {
    if (processEngine != null) {
      processEngine.close();
    }
  }

  public ProcessEngine getObject() throws Exception {
    return processEngine;
  }

  public ProcessEngineConfiguration getProcessEngineConfiguration() {
    return processEngineConfiguration;
  }

  public void setProcessEngineConfiguration(ProcessEngineConfiguration processEngineConfiguration) {
    this.processEngineConfiguration = processEngineConfiguration;
  }

  public Bundle getBundle() {
    return bundle;
  }

  public void setBundle(Bundle bundle) {
    this.bundle = bundle;
  }
}
